"""
实验二：三种抽奖策略，每种策略抽1个人
策略1：让代码自动随机抽取1个，滚动效果，滚动20次之后停止。
策略2：不停的滚动，直到主持人按下停止键。
策略3：不停的滚动，被抽奖人每人填写2个随机值，每次根据算法计算得到一个最小值，
当主持按下暂停键即停止。
"""
import random
import time


def chou_1(user_list):
    for i in range(30):
        select_stu = random.choice(user_list)
        stu_info = select_stu.split("\t")
        print(f"\r学号:{stu_info[1]} 姓名:{stu_info[2]}   ", end="")
        time.sleep(0.1)
    print(f"\r恭喜第一个中奖同学:{stu_info[1]} {stu_info[2]}")


def chou_2(user_list):
    while True:
        try:
            # 给出一个随机的索引值，从93个人的列表里面拿到对应索引值的人
            i = int(time.time() * 1000) % len(user_list)
            select_stu = user_list[i]
            stu_info = select_stu.split("\t")
            print(f"\r学号:{stu_info[1]} 姓名:{stu_info[2]}", end="")
            time.sleep(0.1)
        except KeyboardInterrupt:
            break
    print(f"\r恭喜第二个中奖同学:{stu_info[1]} {stu_info[2]}")


def chou_3(user_list):
    while True:
        try:
            int_x = random.randint(0, 1000)
            int_y = random.randint(0, 1000)
            # 计算随机点与每个同学点之间的距离 ，找到最小距离的那个人
            distance_list = []
            for user in user_list:
                classname, no, name, x, y = user.split("\t")  # 分割之后的结果是一个列表，包含5个信息
                distance = (int_x - int(x)) ** 2 + (int_y - int(y)) ** 2
                distance_list.append((no, name, distance))
            # 对93个人的距离值进行排序 [(001,张三,199),(002,李四,299)....]
            distance_list.sort(key=lambda item: item[2])
            select_stu = distance_list[0]  # 排序之后的第0个就是被选中的同学
            print(f"\r学号:{select_stu[0]} 姓名:{select_stu[1]}", end="")
            time.sleep(0.1)
        except KeyboardInterrupt:
            break
    print(f"\r恭喜第三个中奖同学:{select_stu[0]} {select_stu[1]}")


# 如果希望下面的代码只在当前文件运行的时候执行，就放到if里面
if __name__ == '__main__':
    with open("抽奖名单.txt", encoding="utf-8") as f:
        content = f.read()
        user_list = content.split("\n")  # 以换行符分割，得到一个列表
        # print(user_list)

    chou_1(user_list)
    chou_2(user_list)
    chou_3(user_list)
